package fun.cyhgraph.service;

import fun.cyhgraph.dto.*;
import fun.cyhgraph.result.PageResult;
import fun.cyhgraph.vo.OrderPaymentVO;
import fun.cyhgraph.vo.OrderStatisticsVO;
import fun.cyhgraph.vo.OrderSubmitVO;
import fun.cyhgraph.vo.OrderVO;

/**
 * 订单服务
 */
public interface OrderService {

    /**
     * 订单搜索 条件分页查询订单信息  (管理端-分页查询)
     * @param orderPageDTO
     * @return
     */
    PageResult conditionSearch(OrderPageDTO orderPageDTO);

    /**
     * 不同状态订单数量统计   (管理端)
     * @return
     */
    OrderStatisticsVO statistics();


    /**
     * 根据订单id查询订单详情  （管理端） （用户端）
     * @param id
     * @return
     */
    OrderVO getById(Integer id);

    /**
     * 确认接单   （管理端）
     * @param orderConfirmDTO
     */
    void confirm(OrderConfirmDTO orderConfirmDTO);


    /**
     * 拒单   （管理端）
     * @param orderRejectionDTO
     */
    void reject(OrderRejectionDTO orderRejectionDTO);


    /**
     * 商家取消订单   （用户端）
     * @param orderCancelDTO
     */
    void cancel(OrderCancelDTO orderCancelDTO);


    /**
     * 根据id派送订单   （管理端）
     * @param id
     */
    void delivery(Integer id);


    /**
     * 完成订单   （管理端）
     * @param id
     */
    void complete(Integer id);

    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    /**
     * 用户提交订单   (用户端)
     * @param orderSubmitDTO
     * @return
     */
    OrderSubmitVO submit(OrderSubmitDTO orderSubmitDTO);


    /**
     * 当前用户未支付订单数量  （用户端）
     * @return
     */
    Integer unPayOrderCount();



    /**
     * 订单支付  （用户端）
     * @param orderPaymentDTO
     * @return
     */
    OrderPaymentVO payment(OrderPaymentDTO orderPaymentDTO);


    /**
     * 订单分页查询  （用户端）
     * @param page
     * @param pageSize
     * @param status
     * @return
     */
    PageResult userPage(int page, int pageSize, Integer status);



    /**
     * 用户取消订单  （用户端）
     * @param id
     * @throws Exception
     */
    void userCancelById(Integer id) throws Exception;


    /**
     * 再来一单 （用户端）
     * @param id
     */
    void reOrder(Integer id);


    /**
     * 用户催单  （用户端）
     * @param id
     */
    void reminder(Integer id);

}
